package de.uni_bremen.exceptions.oops;

class VarDeclaration extends Declaration
{
	/** Der Typ der Variablen bzw. des Attributs. */
	ResolvableIdentifier	type;
	
	/** Gibt an, ob es sich um eine Attributvariable handelt. */
	boolean					isAttribute;
	
	/** Gibt an, ob es sich um einen Paramter handelt. */
	boolean					isParameter;
	
	/**
	 * Die Position der Variablen im Stapelrahmen bzw. des Attributs im Objekt. Dies wird während der Kontextanalyse
	 * eingetragen.
	 */
	int						offset;
	
	/**
	 * Konstruktor.
	 * 
	 * @param identifier
	 *            Der Name der deklarierten Variablen bzw. des Attributs.
	 * @param isAttribute
	 *            Wird hier ein Attribut deklariert (statt einer lokalen Variablen)?
	 * @param isParameter
	 *            Wird hier ein Parameter deklariert (statt einer lokalen Variablen)?
	 */
	VarDeclaration(Identifier name, boolean isAttribute, boolean isParameter)
	{
		super(name);
		this.isAttribute = isAttribute;
		this.isParameter = isParameter;
	}
	
	/**
	 * Führt die Kontextanalyse für diese Variablen-Deklaration durch.
	 * 
	 * @param declarations
	 *            Die an dieser Stelle gültigen Deklarationen.
	 * @throws CompileException
	 *             Während der Kontextanylyse wurde ein Fehler gefunden.
	 */
	void contextAnalysis(Declarations declarations) throws CompileException
	{
		declarations.resolveType(type);
	}
	
	/**
	 * Die Methode gibt diese Deklaration in einer Baumstruktur aus.
	 * 
	 * @param tree
	 *            Der Strom, in den die Ausgabe erfolgt.
	 */
	void print(TreeStream tree)
	{
		tree.println(identifier.name + (type.declaration == null ? "" : " (" + offset + ")") + " : " + type.name);
	}
	
	/**
	 * Die Methode gibt den Namen der Variable in Textform aus.
	 */
	@Override
	public String toString()
	{
		return "VAR " + identifier.name;
	}
}
